﻿using System;
using System.Linq;

namespace Shell.PocoDot
{
    /// <summary>
    /// 表示一个数据关系仓库, 此仓库封装了对两种特定的 PocoDot 的 关系操作
    /// </summary>
    public interface IRepository : IPersistent, IDisposable
    {
        /// <summary>
        /// 关系绑定
        /// </summary>
        /// <param name="mainId">主 PocoDot 的标识</param>
        /// <param name="relatedId">从 PocoDot 的标识</param>
        /// <remarks>该操作仅绑定现有的两个 PocoDot 的关系, 并不执行添加或创建操作</remarks>
        /// <exception cref="System.InvalidOperationException">指定的关系已存在</exception>
        void Bind(Guid mainId, Guid relatedId);

        /// <summary>
        /// 关系释放
        /// </summary>
        /// <param name="mainId">主 PocoDot 的标识</param>
        /// <param name="relatedId">从 PocoDot 的标识</param>
        /// <remarks>该操作仅释放现有的两个 PocoDot 的关系, 并不执行删除操作</remarks>
        /// <exception cref="System.InvalidOperationException">指定的关系不存在</exception>
        void Release(Guid mainId, Guid relatedId);

        /// <summary>
        /// 尝试读取关系
        /// </summary>
        /// <param name="mainId">主 PocoDot 的标识</param>
        /// <param name="relatedId">从 PocoDot 的标识</param>
        /// <returns>关系读取的结果, 如果关系不存在则为 false, 否则为 ture</returns>
        bool TryRead(Guid mainId, out Guid relatedId);

        /// <summary>
        /// 读取关系
        /// </summary>
        /// <param name="mainId">主 PocoDot 的标识</param>
        /// <returns>从 PocoDot 的标识</returns>
        /// <exception cref="System.InvalidOperationException">指定的关系不存在</exception>
        Guid Read(Guid mainId);

        /// <summary>
        /// 读取所有关系
        /// </summary>
        /// <param name="mainId">主 PocoDot 的标识</param>
        /// <returns>所有与指定的主 PocoDot 存在关系的从 PocoDot 的标识</returns>
        IQueryable<Guid> ReadAll(Guid mainId);
    }
}
